package io.lvdaxian.mybatis10.scripting;

import java.util.HashMap;
import java.util.Map;

/**
 * 表示语言 驱动注册
 *
 * @author lihh
 */
public class LanguageDriverRegistry {
  // map 注册驱动 && 缓存
  private final Map<Class<?>, LanguageDriver> LANGUAGE_DRIVER_MAP = new HashMap<Class<?>, LanguageDriver>();
  // 一种默认的驱动模式
  private Class<?> defaultDriverClass = null;
  
  /**
   * 这是注册驱动的方式
   *
   * @param cls 类
   * @author lihh
   */
  public void register(Class<?> cls) {
    // 这里执行 null check 判断
    if (cls == null) {
      throw new IllegalArgumentException("null is not a valid Language Driver");
    }
    // 是否实现了 该接口【LanguageDriver】
    if (!LanguageDriver.class.isAssignableFrom(cls)) {
      throw new RuntimeException(cls.getName() + " does not implements " + LanguageDriver.class.getName());
    }
    
    // 检查缓存 && 获取值
    LanguageDriver driver = LANGUAGE_DRIVER_MAP.get(cls);
    if (null != driver) return;
    
    try {
      //单例模式，即一个Class只有一个对应的LanguageDriver
      driver = (LanguageDriver) cls.newInstance();
      LANGUAGE_DRIVER_MAP.put(cls, driver);
    } catch (Exception e) {
      throw new RuntimeException("Failed to load language driver for " + cls.getName(), e);
    }
  }
  
  /**
   * 从这里返回 默认的驱动
   *
   * @return 默认的驱动 class
   * @author lihh
   */
  public Class<?> getDefaultDriverClass() {
    return defaultDriverClass;
  }
  
  /**
   * 通过该 方法来获取驱动
   *
   * @param cls 驱动类
   * @return 语言驱动
   * @author lihh
   */
  public LanguageDriver getDriver(Class<?> cls) {
    return LANGUAGE_DRIVER_MAP.get(cls);
  }
  
  /**
   * 获取默认的驱动
   *
   * @return 返回默认的语言驱动
   * @author lihh
   */
  public LanguageDriver getDefaultDriver() {
    return getDriver(getDefaultDriverClass());
  }
  
  /**
   * 注册 以及获取默认的语言驱动
   *
   * @param defaultDriverClass 默认的驱动类
   * @author lihh
   */
  public void setDefaultDriverClass(Class<?> defaultDriverClass) {
    register(defaultDriverClass);
    this.defaultDriverClass = defaultDriverClass;
  }
}
